#ifndef __RTK_H__
#define __RTK_H__

/**
  ******************************************************************************
  * @file           : rtk.h
  * @brief          : Header for rtk.c file.
  *                   This file contains the common defines of the application.
  * @author			: ac
  * @attention
  *
  *		Copyright (c) 2023 Technology Co., Ltd.
  *
  *******************************************************************************
  */

//#include "xag_log.h"
#include "xag_types.h"
//#include "camera_compile.h"
//#include "xag_common.h" 
//#include "preisp_msg.h"

#ifdef __cplusplus
extern "C"
{
#endif


/*
 * macro definition
 */
#define FRAME_START 0x5B
#define Header_len   9

#define VERSION(ver, sub, biuld) (((XAG_U32)ver << 24)|((XAG_U32)sub << 16)|(biuld & 0xFFFF))
#define PROTOCOL_VERSION            VERSION(3, 1, 9)    //协议 版本

#define HEADER_INIT(p,l,s)  do{ \
    (p)[0] = FRAME_START; \
    (p)[2] = ((l)&0xff);\
    (p)[3] = (((l)>>8)&0xff);\
    (p)[4] = ((PROTOCOL_VERSION)&0xff);\
    (p)[5] = (((PROTOCOL_VERSION)>>8)&0xff);\
    (p)[6] = (((PROTOCOL_VERSION)>>16)&0xff);\
    (p)[7] = (((PROTOCOL_VERSION)>>24)&0xff);\
    (p)[8] = (s);\
}while(0)



/*
 * enum and struction
 */
#define CMD_RTK_BASE_STATION_STATUS		0x02
#define CMD_RTK_EVENT_TRIGGER			0x25

/* xlinkHS 0x80传输数据(返回) */
typedef struct _rtk_0x5B_Header
{
	/*
	 * 数据帧的头，当帧数据需要返回时，新协议Start为0x5B；老协议Start为0x5A
	 */
	XAG_U8 u8Start;

	/*
	 * 协议数据的所有字节之和
	 */
	XAG_U8 u8Checksum;

	/*
	 * Data项的长度
	 */
	XAG_U16 u16Length;

	/*
	 * 协议版本3.1.12**（老协议该字段为空）**
	 */
	XAG_U32 u32ProtocolVersion;

	/*
	 * 状态位，用于表示数据帧的状态
	 */
	XAG_U8 u8Status;

	/*
	 * 设备唯一ID，只有在设备向服务器发送数据时带有，其他时候省略
	 */
	//XAG_U8 u8Id[12];

	/*
	 * 协议功能指令
	 */
	XAG_U8 u8Cmd;

	/*
	 * Data项
	 */
	//XAG_U8 u8Data[0];
}__attribute__((packed)) Rtk_0x5B_Header_T;

/*
 * 获取基站状态信息（cmd：0x02）
 */
typedef struct {
	XAG_U32 Module_Init_State; //模块初始化状态，bit0：NRF；bit1：BT；bit2：Sim；bit3：GPS；bit4：RTK 其余bit保留；0:初始化成功，1:初始化失败
	XAG_U8  Bat_Type;     //电池类型，0x10：智能电池；0x12：太阳能板
	XAG_U8  Status;         //电池状态（Bat_Type==0x12时保留）
	XAG_U16 Voltage;       //总电压mV
	XAG_S16 Current;        //总电流 mA（Bat_Type==0x12时保留）
	XAG_S16 Temp;            //电池温度（Bat_Type==0x12时保留）
	XAG_U16 Vol[12];        //单节电芯电压 mV 
	XAG_U8 Fix_mode;  //定位模式，0x00：NONE；0x01：SINGLE；0x02：L1_FLOAT；0x03：RTK；0x04：FIX
	XAG_U8 SatelliteNumber;  //卫星数
	XAG_F64 Longitude;    //经度
	XAG_F64 Latitude;        //纬度
	XAG_F64 Altitude;        //海拔高度，单位mm
	XAG_F32 PosAccuracy;     //位置精度，单位为米
	XAG_F32 HgtAccuracy;     //高度精度，单位为米
	XAG_F32 Undulation;       //高程异常，单位米
	XAG_U32 ITOW;
	XAG_U16 Week;
	XAG_U16 Diff_Age;      //超时时间，单位S
	XAG_U16 Src_Station_id;    //rtcm 来源基站id
	XAG_U8 Source;           //rtcm com  0:no rtcm 1:NRF  2:Sim      3:BT
	XAG_U8 SIM_State;      //联网状态，bit0 网关1，bit1 网关2，bit2 网关3；1：联网；0：未联网
	XAG_U8 SIM_Rssi;       //网络信号强度
	XAG_U8 NRF_Rssi;       //电台信号强度
	XAG_U8 MCU_State;    //XRTK工作状态
	XAG_U8 NRF_RTCM_State;        // Fix_mode==4，保留
	XAG_U8 SIM_RTCM_State;        // Fix_mode==4，保留
	XAG_U8 BT_RTCM_State;           // Fix_mode==4，保留
	XAG_U8 OEM6_RTCM_State;     // Fix_mode！=4，保留
	XAG_U8 CoolectType;         //采点类型 0：没设置基准点；1：手工输入高精度坐标；2：高精度采点；3：低精度采点；4：手工输入低精度坐标；5：亚米采点；6：自采点24h
	XAG_U8 Progress;       //在线升级百分比 0-100（MCU_State为13时需显示出来）
	XAG_U8 WorkMode;   //工作模式，0x01：固定基站；0x02：移动基站；0x03：测绘器
	XAG_U16 StatusCode; //连接远程基站状态0，未收到服务器返回状态 200, OK; 404, Not Found（未能分配基站）; 800, 基站太远（请求指定StationID时触发）；801，基站离线（从在线变成离线时触发）; 802, 所请求基站RTCM更新异常（不健康）。803（保留）；804，所请求基站电量过低；805，所请求基站被移动；806，所请求基站未固定；该字段与0a指令StatusCode一致
	XAG_U32 Start_ITOW;  //上电时间
	XAG_U16 Start_Week;       //上电时间
	XAG_U16 Start_Voltage;     //上电电压
	XAG_F32 PosDev;             //基站水平位置被移动距离，单位为米
	XAG_F32 HgtDev;      //基站高度被移动距离，单位为米
	XAG_U16  SourceType;   //bit0：固定基站；bit1：移动基站；bit2：千寻；bit3：CORS；bit4: A2登录cors；bit5: 保留；bit6: 手工输入高精度；bit7: 手工输入低精度；bit8: 手工输入低精度；bit9: 低精度采点；bit10: 24小时自采点；其余bit保留。
	XAG_U16  SourceStaId;  //上次引点ID
	XAG_U8 SecFix_mode;        //第二定位状态
	XAG_U8 BroadcastStatus;      //广播状态 0x78:就绪状态，停止广播；0x00:广播中
	XAG_U16 StationId;      //基站ID
	XAG_U8 snr_1;          //天线状态
	XAG_U8 OEM6_RTCM_State2;
	XAG_U8 updaing_status;    //0 未在升级，1：正在升级（文件传输中），2：传输完成（rc）；3:升级完成(wifi，rtk)
	XAG_U8 sol_status; //板卡解状态
	XAG_U16 rtcm_len;  //rtcm数据量
	XAG_U16 rtk_task_cyle; //rtk任务处理周期
	XAG_U8 Reserve[2];           //保留字段
}__attribute__((packed)) Station_Status_T;


typedef struct
{
    struct
    {
        XAG_U16 week;
        XAG_U16 counter;
        XAG_U32 second;
        XAG_U32 subSecond;//ns
        XAG_U32 offset_second;
        XAG_U32 offset_subSecond;//ns
    }__attribute__((packed))time;
    struct
    {
        double lat;
        double lon;
        double hgt;

        float lat_sd;
        float lon_sd;
        float hgt_sd;
    }__attribute__((packed))pos;
    struct
    {
        float eastVel;
        float northVel;
        float upVel;
    }__attribute__((packed))vel;
    struct
    {
        XAG_U8 FixMode;
        XAG_U32 stn_id;
        XAG_U16 diff_age;

        XAG_U8 solnSVs;
    }__attribute__((packed))sol;
    
}__attribute__((packed)) Gps_Event_T;


/*
 * exported functions prototypes
 */ 
XAG_U8 Data_CheckSum(XAG_U8 *data, XAG_U16 len);
void rtk_cmd_package(unsigned char *protocol_buff, int len, int cmd);
void rtk_resolving_0x02_cmd(unsigned char * pdata, int len);
void rtk_resolving_0x25_cmd(unsigned char * pdata, int len);

#ifdef __cplusplus
}
#endif

#endif /* __RTK_H__ */
